import { localCache } from "@/utils/cacheData"
import { BASE_URL, TIME_OUT } from "./config"
import SYRequest from "./request"
import { ACCESS_TOKEN, AccessTokenInvalid } from "@/global/constants"
import { getAccessToken, removeAccessToken } from "./Authority/cacheToken"
import { addExpiredRequest, refreshTokenServer } from "./Authority/refresh"

export const syRequest = new SYRequest({
  baseURL: BASE_URL,
  timeout: TIME_OUT,

  // 创建一些拦截器
  interceptors: {
    requestSuccessFn: (config) => {
      // config.headers是可选类型，不能通过可选类型加 . 去赋值
      // 法一：加！.  --> 非空断言，表示config.headers一定有值
      // config.headers!.Authorization = "Bearer" + localCache.getCache(LOGIN_TOKEN)

      // 法二：加一个if判断,进行类型缩小
      /* 原来的方式 */
      // const token = localCache.getCache(LOGIN_TOKEN)
      // if (config.headers && token) {
      //   config.headers.Authorization = token
      // }
      // return config

      /* 双token的方式 */
      // console.log(config)
      if (config.headers && getAccessToken()) {
        config.headers[ACCESS_TOKEN] = getAccessToken()
      }

      return config
    },
    //   requestFailureFn: (err) => {
    //     console.log("张师易请求成失败的拦截")
    //     return err
    //   },
    responseSuccessFn: function (res) {
      // 获取到配置和后端响应的数据
      const { config } = res

      return new Promise((resolve, reject) => {
        const atInvalid = res.headers[AccessTokenInvalid]
        /* 短token失效 --> 用长token获取新的token */
        if (atInvalid) {
          console.log("atInvalid 短token失效")
          // 移除失效的短token
          removeAccessToken()
          // 把过期请求存储起来，用于请求到新的短token，再次请求，达到无感刷新
          addExpiredRequest(config)

          // 携带长token去请求新的token
          const { id, account } = localCache.getCache("userInfo")
          refreshTokenServer(id, account)
            .then((result) => {
              resolve(result)
              return res
            })
            .catch((err) => {
              reject(err)
            })
        } else {
          resolve(res)
        }
      })
    }
    //   responseFailureFn(err) {
    //     console.log("张师易响应失败的拦截")
    //     return err
    //   }
  }
})

export default syRequest
